# -*- coding: utf-8 -*-
require 'app_active_record'# ActiveRecord拡張
require_dependency 'login_system'# ログイン機能

#
#アプリケーションコントローラ．
#全てのコントローラの親コントローラとなる．
#
#アプリケーション全体にかかる認証処理やデフォルトで読み込むヘルパの定義を行う
#
class ApplicationController < ActionController::Base
  #認証処理を行うライブラリ
  include LoginSystem

  #--
  # フィルタ定義
  #++
  #ローカライズ処理実施
  before_filter :loadMessage  

  #--
  # 追加ヘルパー定義
  #++
  #プロジェクトヘルパ，js，css圧縮ヘルパを読み込み
  helper :project, :jsmin

  #
  #ローカライズ用テーブルデータ(多言語データ）を読み込み、ハッシュに格納する
  #
  def loadMessage
    lang = ""                       # 言語設定値
    #-----------------------------
    # 検索条件
    #-----------------------------
    # 有効データのみ
    conditions = "valid_flg = 1"
    
    #-----------------------------
    # 取得対象カラムの判定
    #-----------------------------
    select = ""
    if ! lang.nil?
      case lang.to_s
      when "jp"# 日本語カラムを取得
        select = " id, msg_code, msg_kbn, msg_jp as msg, msg_jp as msg_base "
      when "cn"# 中国語カラムを取得
        select = " id, msg_code, msg_kbn, msg_cn as msg, msg_cn as msg_base "
      when "en"# 英語カラムを取得
        select = " id, msg_code, msg_kbn, msg_en as msg, msg_en as msg_base "
      else# ベースカラムを取得
        select = " id, msg_code, msg_kbn, msg_base as msg, msg_base as msg_base "
      end
    end
  
    #-----------------------------
    # 検索実施
    #-----------------------------
    opt = {
      :select     => select,
      :conditions => conditions
    }
    @app_messages = MstMessage.find(:all, opt)

    #-----------------------------
    # 区分、コードをキーにハッシュへ格納
    #-----------------------------
    @app_messages_hash = Hash.new
    #for app_message in @app_messages
    @app_messages.each do |app_message|
      msg_kbn = ""
      case app_message.msg_kbn
      when 1
        # ラベル
        msg_kbn = "label"
      when 2
        # 確認メッセージ
        msg_kbn = "confirm"
      when 3
        # エラーメッセージ
        msg_kbn = "error"
      else
        # その他
        msg_kbn = "other"
      end
      # ローカライズ用ハッシュへ格納
      @app_messages_hash[msg_kbn + "_" + app_message.msg_code] = app_message
    end
  end

  #
  #指定されたパラメータの内容でJSONデータを生成して返す
  #_success_ :: 処理結果(true:成功、false:失敗)をBoolean型で指定します
  #_message_ :: messageデータに渡すメッセージを指定します
  #_result_ :: resultというキーで生成されるデータが表示されます，結果情報ハッシュデータを指定します
  #
  #戻り値:: JSONデータ
  #
  def result_for_json(success, message, result)
    ret = {
      :success => success,
      :message => message,
      :result  => result
    }
    return ret.to_json
  end




  protected


  #
  #ログインユーザーが参加しているプロジェクトのリスト（メニュータブに使用）、
  #および選択中のプロジェクトを取得します(セッション使用）
  #
  def get_project_info
    #-----------------------------
    # ログイン中ユーザーが参加している
    # アクティブなプロジェクトのリストを取得
    #-----------------------------
    user_id = session["user"]["id"]
    opt = {
      :include    => [{:dat_projectusers=>:mst_user}],
      :conditions => [
        "dat_projects.valid_flg = 1 AND dat_projects.id in (SELECT pu.project_id FROM dat_projectusers pu WHERE pu.user_id = ? AND pu.active_flg=1 )", 
        user_id
      ],
      :order => "dat_projects.id desc"
    }
    @g_projects = DatProject.find(:all, opt)

    #-----------------------------
    # 選択中プロジェクトを決定
    #-----------------------------
    if params[:controller] == "project" && ! params[:id].nil?
      # プロジェクトのアクションで、IDが指定されている場合、
      # セッションの選択中プロジェクトIDを更新
      sel_id = params[:id]
      session[:project] = {:sel_id=>params[:id]}
    elsif params[:controller] == "project" && params[:action] != "edit_active" && params[:action] != "new"
      # プロジェクトアクティブ設定アクションおよび、新規プロジェクトアクション以外の
      # プロジェクトアクションの場合は、セッションの選択中プロジェクトIDを指定
      sel_id = session[:project].nil? ? "" : (session[:project][:sel_id].nil? ? "" : session[:project][:sel_id])
    else
      # 上記以外の場合は、選択中プロジェクトは「なし」扱い
      sel_id = nil
    end
    
    if sel_id.nil?
      @g_cur_project = nil
    elsif sel_id == ""
      @g_cur_project = @g_projects.length > 0 ? @g_projects[0] : nil
    else
      for p in @g_projects
        if p.id.to_s == sel_id
          @g_cur_project = p
          break
        end
      end
      if @g_cur_project.nil?
        @g_cur_project = @g_projects.length > 0 ? @g_projects[0] : nil
      end
    end
  end


  #
  #現在アクティブなプロジェクトに属するファイルを格納するディレクトリへのパスを返却します
  #
  def get_project_files_root(project_id)
    return "#{RAILS_ROOT}#{$PROJECTFILES_ROOT}" + project_id.to_s
  end


  # 現在ログイン中のユーザが指定されたプロジェクトに所属しているかをチェック
  def my_project?(project_id)
    if session['user'] and !project_id.blank?
      current_user_id = session['user']['id']
      project = DatProject.find(project_id)
      project_users = project.dat_projectusers.find(:all)
      ids = []
      project_users.map {|u| ids << u.user_id unless u.user_id.nil? }
      ids.include? current_user_id
    end
  end

  # 取得ファイル(ディレクトリ)のパスが妥当かどうかをチェック
  def valid_node?(project_id, node)
    rootpath = get_project_files_root(project_id)
    path     = rootpath + node
    valid    = false
    Dir.chdir(path) do |path|
      pwd = Dir.pwd
      valid = true if  pwd.include?(rootpath)
    end
    valid
  end
end
